<?php
    include(dirname(__FILE__)."/../include/apility/apility.php");
    include(dirname(__FILE__)."/../Dao/db.php");

    class SynchronizeTimer
    {
         //アカントの情報
        var $authenticationContext;
        //例外の情報処理対象
        var $faultStack;
        //現在の日付
        var $Date;
        //現在の曜日
        var $Week;
        //現在の時間
        var $Time;
        //全体Adwordsアカウント(クライアントセンターに登録済み)
        var $AllAccounts;

        function SynchronizeTimer()
        {
            //例外処理対象を取得
            $this->faultStack = &APIlityFault::getFaultStack();
            //アカントの情報設定
            $this->authenticationContext = &APIlityAuthentication::getContext();
            $this->Date = date("Y-m-d");
            $this->Week = date("w");
            $this->Time = date("G");
            echo date("Y-m-d H:i:s")."　処理待ちメンバとアカウント情報を取得開始\r\n";
            $this->AllAccounts = $this->getAllAccounts();
            echo date("Y-m-d H:i:s")."　処理待ちメンバとアカウント情報を取得成功\r\n";
        }

        //バッチ実行
        function run()
        {
            echo date("Y-m-d H:i:s")."　タイマー入札バッチ処理開始\r\n\r\n";
            foreach($this->AllAccounts as $account)
            {
                $memberId = $account['memberId'];
                $accountName = $account['account_name'];
                echo date("Y-m-d H:i:s")."　メンバ：".$memberId."　アカウント：".$accountName."　処理開始\r\n";
                if(!$this->setContext($accountName))
                {
                    echo date("Y-m-d H:i:s")."　メンバ：".$memberId."　アカウント：".$accountName."　異常終了\r\n\r\n";
                    continue;
                }
                //キャンペーンタイマー
                echo date("Y-m-d H:i:s")."　キャンペーンタイマー入札開始\r\n";
                $this->doCampaignTimer($memberId);
                echo date("Y-m-d H:i:s")."　キャンペーンタイマー入札終了\r\n";
                //広告グループタイマー
                echo date("Y-m-d H:i:s")."　広告グループタイマー入札開始\r\n";
                $this->doAdGroupTimer($memberId);
                echo date("Y-m-d H:i:s")."　広告グループタイマー入札終了\r\n";
                //キーワードタイマー
                echo date("Y-m-d H:i:s")."　キーワードタイマー入札開始\r\n";
                $this->doKeywordTimer($memberId);
                echo date("Y-m-d H:i:s")."　キーワードタイマー入札終了\r\n";
                echo date("Y-m-d H:i:s")."　メンバ：".$memberId."　アカウント：".$accountName."　処理終了\r\n\r\n";
            }
            echo date("Y-m-d H:i:s")."　タイマー入札バッチ処理終了\r\n\r\n";
        }

        function setContext($ClientEmail)
        {
            //マネッジャのアカント設定
            $this->authenticationContext->setClientEmail($ClientEmail);
            if(!getAccountInfo())
            {
                $fault = array_pop($this->faultStack);
                if(isset($fault))
                {
                    $fault->printFault();
                }
                echo date("Y-m-d H:i:s")."　該当クライアントアカントはクライアントセンターに管理しないかもしれません。或いはネット問題です。ご確認ください。\r\n";
                return false;
            }
            return true;
        }

        //クライアントセンターに登録済みアカウント情報を取得する
        function getAllAccounts()
        {
            $query = "SELECT  A.memberId,A.account_name ";
            $query .= "FROM   account A ";
            $query .= "JOIN   member B ";
            $query .= "ON     A.memberId=B.memberId ";
            $query .= "WHERE  A.status=1 ";
            $query .= "AND    B.ccStatus=1";

            $result = mysql_query($query);
            $accounts = array();
            while($row = mysql_fetch_array($result))
            {
                array_push($accounts,$row);
            }
            return $accounts;
        }

        function doCampaignTimer($memberId)
        {
            //処理待ちタイマーを検索
            $query = "SELECT  A.*,B.campaignId ";
            $query .= "FROM   TimerCampSchedule A ";
            $query .= "JOIN   campaign B ";
            $query .= "ON     A.camp_Id=B.camp_Id ";
            $query .= "AND    B.campaignId IS NOT NULL ";
            $query .= "AND    B.status!=9 ";
            $query .= "AND    B.sync=1 ";
            $query .= "AND    A.EnableFlg=1 ";
            $query .= "WHERE  (A.TimerType=0 ";
            $query .= "OR     (A.TimerType=1 AND INSTR(A.Week,$this->Week)) ";
            $query .= "OR     (A.TimerType=2 AND TO_DAYS(A.Date)=TO_DAYS('$this->Date'))) ";
            $query .= "AND    A.Time=$this->Time ";
            $query .= "AND    A.memberId=$memberId";

            $result = mysql_query($query);
            if($result)
            {
                while($row = mysql_fetch_array($result))
                {
                    $campaignId = $row['campaignId'];
                    echo date("Y-m-d H:i:s")."　キャンペーン[$campaignId]タイマー入札開始\r\n";
                    $campaignObject = createCampaignObject($campaignId);
                    if(!$campaignObject)
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        echo date("Y-m-d H:i:s")."　キャンペーン[$campaignId]タイマー入札失敗\r\n";
                        continue;
                    }

                    $status = $row['AppearFlg'];
                    if($status == 0)
                    {
                        $status = "Paused";
                    }
                    else if($status == 1)
                    {
                        $status = "Active";
                    }
                    //ウェブサービスコールして、Adwords側の掲載状態を更新する
                    if(!$campaignObject->setStatus($status))
                    {
                        //エラーの場合、エラーメッセージを表示する
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        echo date("Y-m-d H:i:s")."　キャンペーン[$campaignId]タイマー入札失敗\r\n";
                    }
					else
					{
						$query = "Update campaign SET status=".$row['AppearFlg']." where campaignId=$campaignId ";
						$result = mysql_query($query);
						if ($result != "1")
						{
							echo date("Y-m-d H:i:s")."　キャンペーン[$campaignId]更新失敗\r\n";
						}
						else
						{
							echo date("Y-m-d H:i:s")."　キャンペーン[$campaignId]更新成功\r\n";
						}
					}
                }
            }
            else
            {
                echo $query;
                echo "\r\n";
                echo mysql_errno() . ": " . mysql_error() . "\r\n";
                echo date("Y-m-d H:i:s")."　タイマー情報取得失敗\r\n";
            }
        }

        function doAdGroupTimer($memberId)
        {
            //処理待ちタイマーを検索
            $query = "SELECT  A.*,B.adGroupId ";
            $query .= "FROM   TimerAdgroupSchedule A ";
            $query .= "JOIN   adgroup B ";
            $query .= "ON     A.adGr_Id=B.adGr_Id ";
            $query .= "AND    B.adGroupId IS NOT NULL ";
            $query .= "AND    B.status!=9 ";
            $query .= "AND    B.sync=1 ";
            $query .= "AND    A.EnableFlg=1 ";
            $query .= "WHERE  (A.TimerType=0 ";
            $query .= "OR     (A.TimerType=1 AND INSTR(A.Week,$this->Week)) ";
            $query .= "OR     (A.TimerType=2 AND TO_DAYS(A.Date)=TO_DAYS('$this->Date'))) ";
            $query .= "AND    A.Time=$this->Time ";
            $query .= "AND    A.memberId=$memberId";

            $result = mysql_query($query);
            if($result)
            {
                while($row = mysql_fetch_array($result))
                {
                    $adGroupId = $row['adGroupId'];
                    echo date("Y-m-d H:i:s")."　広告グループ[$adGroupId]タイマー入札開始\r\n";
                    $adGroupObject = createAdGroupObject($adGroupId);
                    if(!$adGroupObject)
                    {
                        //エラーを取得
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        echo date("Y-m-d H:i:s")."　広告グループ[$adGroupId]タイマー入札失敗\r\n";
                        continue;
                    }

                    //画面に掲載オン/オフを切り替えるをチェックした場合
                    if(strpos($row['Task'],"0") !== False)
                    {
                        $status = $row['AppearFlg'];
                        if($status == 1)
                        {
                            $status = "Enabled";
                        }
                        else if($status == 0)
                        {
                            $status = "Paused";
                        }
                        //ウェブサービスコールして、Adwords側の掲載状態を更新する
                        if(!$adGroupObject->setStatus($status))
                        {
                            //エラーの場合、エラーメッセージを表示する
                            $fault = array_pop($this->faultStack);
                            if(isset($fault))
                            {
                                $fault->printFault();
                            }
                            echo date("Y-m-d H:i:s")."　広告グループ[$adGroupId]タイマー入札「掲載オン/オフを切り替える」失敗\r\n";
                        }
						else
						{
							$query = "Update adgroup SET status=".$row['AppearFlg']." where adGroupId=$adGroupId ";
							$result = mysql_query($query);
							if ($result != "1")
							{
								echo date("Y-m-d H:i:s")."　広告グループ[$adGroupId]タイマー入札「掲載オン/オフを切り替える」更新失敗\r\n";
							}
							else
							{
								echo date("Y-m-d H:i:s")."　広告グループ[$adGroupId]タイマー入札「掲載オン/オフを切り替える」更新成功\r\n";
							}
						}
                    }
                    //画面にスポンサードサーチ入札額を変更するをチェックした場合
                    if(strpos($row['Task'],"1") !== False)
                    {
                        $keywordMaxCpc = $row['maxCpc'];
                        if(!$adGroupObject->setKeywordMaxCpc($keywordMaxCpc))
                        {
                            $fault = array_pop($this->faultStack);
                            if(isset($fault))
                            {
                                $fault->printFault();
                            }
                            echo date("Y-m-d H:i:s")."　広告グループ[$adGroupId]タイマー入札「スポンサードサーチ入札額を変更」失敗\r\n";
                        }
						else
						{
							$query = "Update adgroup SET maxCpc=$keywordMaxCpc where adGroupId=$adGroupId ";
							$result = mysql_query($query);
							if ($result != "1")
							{
								echo date("Y-m-d H:i:s")."　広告グループ[$adGroupId]タイマー入札「スポンサードサーチ入札額を変更」更新失敗\r\n";
							}
							else
							{
								echo date("Y-m-d H:i:s")."　広告グループ[$adGroupId]タイマー入札「スポンサードサーチ入札額を変更」更新成功\r\n";
							}
						}
                    }
                    //画面にコンテンツマッチ入札額を変更するをチェックした場合
                    if(strpos($row['Task'],"2") !== False)
                    {
                        $keywordContentMaxCpc = $row['maxContentCpc'];
                        if(!$adGroupObject->setKeywordContentMaxCpc($keywordContentMaxCpc))
                        {
                            $fault = array_pop($this->faultStack);
                            if(isset($fault))
                            {
                                $fault->printFault();
                            }
                            echo date("Y-m-d H:i:s")."　広告グループ[$adGroupId]タイマー入札「コンテンツマッチ入札額を変更」失敗\r\n";
                        }
						else
						{
							$query = "Update adgroup SET maxContentCpc=$keywordContentMaxCpc where adGroupId=$adGroupId ";
							$result = mysql_query($query);
							if ($result != "1")
							{
								echo date("Y-m-d H:i:s")."　広告グループ[$adGroupId]タイマー入札「コンテンツマッチ入札額を変更」更新失敗\r\n";
							}
							else
							{
								echo date("Y-m-d H:i:s")."　広告グループ[$adGroupId]タイマー入札「コンテンツマッチ入札額を変更」更新成功\r\n";
							}
						}
                    }
                }
            }
        }

        function doKeywordTimer($memberId)
        {
            //処理待ちタイマーを検索
            $query = "SELECT  A.*,B.keywordId,C.adGroupId ";
            $query .= "FROM   TimerKeywordSchedule A ";
            $query .= "JOIN   keyword B ";
            $query .= "ON     A.key_Id=B.key_Id ";
            $query .= "AND    B.keywordId IS NOT NULL ";
            $query .= "AND    B.status!=9 ";
            $query .= "AND    B.sync=1 ";
            $query .= "AND    A.EnableFlg=1 ";
            $query .= "JOIN   adgroup C ";
            $query .= "ON     B.adGr_Id=C.adGr_Id ";
            $query .= "WHERE  (A.TimerType=0 ";
            $query .= "OR     (A.TimerType=1 AND INSTR(A.Week,$this->Week)) ";
            $query .= "OR     (A.TimerType=2 AND TO_DAYS(A.Date)=TO_DAYS('$this->Date'))) ";
            $query .= "AND    A.Time=$this->Time ";
            $query .= "AND    A.memberId=$memberId";

            $result = mysql_query($query);
            if($result)
            {
                while($row = mysql_fetch_array($result))
                {
                    $keywordId = $row['keywordId'];
                    $adGroupId = $row['adGroupId'];
                    echo date("Y-m-d H:i:s")."　キーワード[$keywordId]タイマー入札開始\r\n";
                    $keywordObject = createCriterionObject($adGroupId,$keywordId);
                    if(!$keywordObject)
                    {
                        //エラーを取得
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        echo date("Y-m-d H:i:s")."　キーワード[$keywordId]タイマー入札失敗\r\n";
                        continue;
                    }

                    //画面に掲載オン/オフを切り替えるをチェックした場合
                    if(strpos($row['Task'],"0") !== False)
                    {
                        $paused = ($row['AppearFlg'] == 0)?1:0;
                        //ウェブサービスコールして、Adwords側の掲載状態を更新する
                        if(!$keywordObject->setIsPaused($paused))
                        {
                            $fault = array_pop($this->faultStack);
                            if(isset($fault))
                            {
                                $fault->printFault();
                            }
                            echo date("Y-m-d H:i:s")."　キーワード[$key_Id]タイマー入札「掲載オン/オフを切り替える」失敗\r\n";
                        }
						else
						{
							$query = "Update keyword SET status=".$row['AppearFlg']." where keywordId=$keywordId ";
							$result = mysql_query($query);
							if ($result != "1")
							{
								echo date("Y-m-d H:i:s")."　キーワード[$keywordId]タイマー入札「掲載オン/オフを切り替える」更新失敗\r\n";
							}
							else
							{
								echo date("Y-m-d H:i:s")."　キーワード[$keywordId]タイマー入札「掲載オン/オフを切り替える」更新成功\r\n";
							}
						}
                    }
                    //画面に入札額を変更するをチェックした場合
                    if(strpos($row['Task'],"1") !== False)
                    {
                        $keywordMaxCpc = $row['maxCpc'];
                        if(!$keywordObject->setMaxCpc($keywordMaxCpc))
                        {
                            $fault = array_pop($this->faultStack);
                            if(isset($fault))
                            {
                                $fault->printFault();
                            }
                            echo date("Y-m-d H:i:s")."　キーワード[$key_Id]タイマー入札「入札額を変更」失敗\r\n";
                        }
						else
						{
							$query = "Update keyword SET maxCpc=$keywordMaxCpc where keywordId=$keywordId ";
							$result = mysql_query($query);
							if ($result != "1")
							{
								echo date("Y-m-d H:i:s")."　キーワード[$keywordId]タイマー入札「入札額を変更」更新失敗\r\n";
							}
							else
							{
								echo date("Y-m-d H:i:s")."　キーワード[$keywordId]タイマー入札「入札額を変更」更新成功\r\n";
							}
						}
                    }
                }
            }
        }


    }

$instance = new SynchronizeTimer();
$instance->run();

?>
